﻿/***********************************************
 * ここの関数たちは速度の関係で後々ひとつの関数にします。
 * 関数別になっているのはデバッグがやりやすいからです。
 * 
 * 
 * //んで、２つ以上のクラスに対応するために最短一致にするのと、
 * //なんか消えるバグをけす。Matchるーぷにする。
 * 上はもうできました。
 * 
 * 後は...クラス読み取りのとき、一番初めのクラス取っちゃうのを直す。きっと。
 * 
 * 
 * 
 * 2011-05-03
 * Comit By Swallow.
 *
***********************************************/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;


class Optimization
{
    static public void Proc(ref string Code)//メインプロセス
    {

        //Optimization.Class(ref Code);//クラス処理

        Regex r;

        /////////////////
        // 各種記号処理
        Code = Regex.Replace(Code, @"\[", " [ "); // [
        Code = Regex.Replace(Code, "]", "]; "); //]　を　];　に変更する
        Code = Regex.Replace(Code, ";", " ; "); // ; の一つ前にスペースを挿入する
        Code = Regex.Replace(Code, ":", " : ");// : の前後にスペースを挿入する
        Code = Regex.Replace(Code, "@"," @ ");

        //////////////////
        //ダブルドット処理
        Code = Regex.Replace(Code, @"\.\.", " .. ");

        ////////////////
        //　ドット処理
        r = new Regex(@"(?<N>[^\.])\.(?<B>[^\.])");
        Code = r.Replace(Code, "${N} . ${B}");

        ////////////////
        // ++処理
        r = new Regex(@"\+\+");
        Code = r.Replace(Code, "+=1");//++処理

        /////////////////
        // +処理
        r = new Regex(@"(?<A>[^+])\+(?<B>[^=])");
        Code = r.Replace(Code, "${A} + ${B}");//+処理


        ///////////////
        // +=処理
        r = new Regex(@"\+=");
        Code = r.Replace(Code, " += ");

        r = new Regex(@"(?<Name>[ \w]+)\s\+=\s(?<Names>.+?)");//x = x + y

        Code = r.Replace(Code, @" ${Name} = ${Name} + ${Names} ");//+=処理

        ///////////
        // --処理
        r = new Regex(@"\-\-");//--
        Code = r.Replace(Code, "-=1");

        //////////
        // -処理
        r = new Regex(@"(?<A>[^+])\-(?<B>[^=])");//xx-xx
        Code = r.Replace(Code, "${A} - ${B}");


        ///////////
        // -=処理
        r = new Regex(@"\-=");
        Code = r.Replace(Code, " -= ");

        r = new Regex(@"(?<Name>[ \w]+)\s\-=\s(?<Names>.+?)");//x = x - y
        Code = r.Replace(Code, @" ${Name} = ${Name} - ${Names} ");

        ////////////
        // /処理
        r = new Regex(@"(?<A>[^+])\/(?<B>[^=])");
        Code = r.Replace(Code, "${A} / ${B}");

        ///////////
        // /=処理
        r = new Regex(@"\/=");
        Code = r.Replace(Code, " /= ");
        r = new Regex(@"(?<Name>[ \w]+)\s\/=\s(?<Names>.+?)");//x = x / y
        Code = r.Replace(Code, @" ${Name} = ${Name} / ${Names} ");

        /////////////
        // *処理
        r = new Regex(@"(?<A>[^+])\*(?<B>[^=])");
        Code = r.Replace(Code, "${A} * ${B}");

        ///////////
        // *=処理
        r = new Regex(@"\*=");
        Code = r.Replace(Code, " *= ");

        r = new Regex(@"(?<Name>[ \w]+)\s\*=\s(?<Names>.+?)");//x = x * y
        Code = r.Replace(Code, @" ${Name} = ${Name} * ${Names} ");

        /////////////
        // %処理
        r = new Regex(@"(?<A>[^+])\%(?<B>[^=])");
        Code = r.Replace(Code, "${A} % ${B}");

        ///////////////
        // %=処理
        r = new Regex(@"\%=");
        Code = r.Replace(Code, " %= ");

        r = new Regex(@"(?<Name>[ \w]+)\s\%=\s(?<Names>.+?)");//x = x / y

        Code = r.Replace(Code, @" ${Name} = ${Name} % ${Names} ");

        //////////////
        // ^処理
        r = new Regex(@"(?<Left>[^=><]+?)\^(?<Right>[^=><]+?)");
        Code = r.Replace(Code, "${Left} ^ ${Right}");

        /////////////
        // 変数の初期化関連の処理
        r = new Regex(@"var\s+(?<Name>\w+)\s+=\s(?<Value>[\w\d]+)");

        Code = r.Replace(Code, @"(var ${Name} ; ${Name} = ${Value} )");

        ////////////
        // ()処理
        r = new Regex(@"\(");
        Code = r.Replace(Code, " ( ");
        r = new Regex(@"\)");
        Code = r.Replace(Code, " ) ");

        ////////////
        // >処理
        r = new Regex(@"(?<Left>[^=><]+)\>(?<Right>[^=><]+)");
        Code = r.Replace(Code, "${Left} > ${Right}");

        //////////////
        // >=処理
        r = new Regex(@"\>=");
        Code = r.Replace(Code, " >= ");

        /////////////
        // >>の処理
        new Regex(@"\>\>");//>>
        Code = r.Replace(Code, " >> ");

        ///////////////
        // <処理
        r = new Regex(@"(?<Left>[^=><]+)\<(?<Right>[^=><]+)");
        Code = r.Replace(Code, "${Left} < ${Right}");

        ///////////////////
        // <=処理
        r = new Regex(@"\<=");
        Code = r.Replace(Code, " <= ");

        ////////////////////
        // <<処理
        r = new Regex(@"\<\<");//--
        Code = r.Replace(Code, " << ");

        ///////////
        // =処理
        r = new Regex(@"(?<Left>[^=><]+?)\=(?<Right>[^=><]+?)");// = 
        Code = r.Replace(Code, "${Left} = ${Right}");


        ///////////
        // &処理
        r = new Regex(@"(?<Left>[^=><&]+?)\&(?<Right>[^=><&]+?)");// &
        Code = r.Replace(Code, "${Left} & ${Right}");

        ////////////////
        // |処理
        r = new Regex(@"(?<Left>[^=><|]+?)\|(?<Right>[^=><|]+?)");// |
        Code = r.Replace(Code, "${Left} | ${Right}");

        //////////////
        // ==処理
        r = new Regex(@"\=\=");//==
        Code = r.Replace(Code, " == ");

        //////////////
        // !=処理
        r = new Regex(@"\!\=");//!=
        Code = r.Replace(Code, " != ");

        /////////////
        // &&処理
        r = new Regex(@"\&\&");//--
        Code = r.Replace(Code, " && ");

        /////////////
        // ||処理
        r = new Regex(@"\|\|");//--
        Code = r.Replace(Code, " || ");
       
    }

}

